#include <jni.h>
#include <string>
#include <random>
#include "stdio.h"
#include "stdlib.h"
// 头文件
#include "android/log.h"

//定义输出的TAG
const char *LOG_TGA = "LOG_TGA";

const int MAX = 3;
struct Student {
    int age;
    char *name;

};

int main();

int m();

int max(int, int);

int pmax();

int pmethod(int (*ppmax)(void));

Student isStu();

Student isStudent(struct Student student);

void main_bit();

// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) {
    for (size_t i = 0; i < arraySize; i++)
        array[i] = getNextValue();
}

// 获取随机值
int getNextRandomValue(void) {
    return rand();
}

int main_() {
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    for (int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_dingqb_ndkbase_LocalNative_stringFromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement stringFromJNI()
    main();
    int var1;
    char var2[10];

    printf("var1 变量的地址： %p\n", &var1);
    printf("var2 变量的地址： %p\n", &var2);

    int var = 20;   /* 实际变量的声明 */
    int *ip;        /* 指针变量的声明 */

    ip = &var;  /* 在指针变量中存储 var 的地址 */

    printf("Address of var variable: %p\n", &var);

    /* 在指针变量中存储的地址 */
    printf("Address stored in ip variable: %p\n", ip);

    /* 使用指针访问值 */
    printf("Value of *ip variable: %d\n", *ip);

    //
    int *pInt = NULL;

    jint version = env->GetVersion();
    std::string hello = "Hello from C++";
    __android_log_print(ANDROID_LOG_ERROR, LOG_TGA, "hello native log");
    return env->NewStringUTF(hello.c_str());
}extern "C"
JNIEXPORT jint JNICALL
Java_com_dingqb_ndkbase_LocalNative_getAuthValue(JNIEnv *env, jobject thiz, jint v1, jint v2) {
    // TODO: implement getAuthValue()
    int input1 = v1 + v2;
    int version = env->GetVersion();
    return version;
}

int main() {
    m();
    pmax();
    main_();
    pmethod(pmax);
    Student student = isStu();
    Student student1 = isStudent(student);
    main_bit();
    return 0;
}

int m() {
    int var[] = {10, 100, 200};
    int i, *ptr;

    /* 指针中的数组地址 */
    ptr = var;
    for (i = 0; i < MAX; i++) {

        printf("存储地址：var[%d] = %x\n", i, ptr);
        printf("存储值：var[%d] = %d\n", i, *ptr);

        /* 移动到下一个位置 */
        ptr++;
    }
    return 0;
}

int max(int a, int b) {
    int result = a >= b ? a : b;
    return result;
}

/**
 *
 */
int pmax() {
    // p 是函数指针 ，&可以省略
    int (*p)(int, int) = &max;
    int (*p2)(int, int) = max;
    int a = 10, b = 20;
    int result = p(a, b);
    int result2 = p2(a, b);
    int r = rand();
    return result;
}

/**
 * 函数指针作为参数
 */
int pmethod(int (*ppmax)(void)) {
    int result = ppmax();
    return result;

}


bool sstt() {
    char cs[10] = "Hello";
    char cs2[] = "World";
    printf("%s", cs);
    printf("%s", cs2);
    int len = strlen(cs);
    bool equ = strcmp(cs, cs2);
    char *strP = "Hello";
    int plen = strlen(strP);

    return false;
}


Student isStu() {
    Student student;
    student.age = 18;
    student.name = "123";
    int age = student.age;
    char *name = student.name;
    return student;
}

/**
 * 为了使用指向该结构的指针访问结构的成员，您必须使用 -> 运算符
 */
Student isStudent(struct Student student) {
    Student *stu;
    stu = &student;
    char *pstuName = stu->name;
    int page = stu->age;
    char *newName = "New Name";
    stu->name = newName;
    stu->age = 188;
    return student;
}

void main_bit() {
    struct bs {
        unsigned a:1;
        unsigned b:3;
        unsigned c:4;
    } bit, *pbit;
    bit.a = 1;    /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    bit.b = 7;    /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    bit.c = 15;    /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    printf("%d,%d,%d\n", bit.a, bit.b, bit.c);    /* 以整型量格式输出三个域的内容 */
    pbit = &bit;    /* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a = 0;    /* 用指针方式给位域 a 重新赋值，赋为 0 */
    pbit->b &= 3;    /* 使用了复合的位运算符 "&="，相当于：pbit->b=pbit->b&3，位域 b 中原有值为 7，与 3 作按位与运算的结果为 3（111&011=011，十进制值为 3） */
    pbit->c |= 1;    /* 使用了复合位运算符"|="，相当于：pbit->c=pbit->c|1，其结果为 15 */
    printf("%d,%d,%d\n", pbit->a, pbit->b, pbit->c);    /* 用指针方式输出了这三个域的值 */
}

void typedeff() {
    typedef char *String;
    String str = "123";
    strlen(str);

}

